﻿using Onshi.POS.Articulos.Vistas;
using Onshi.POS.Articulos;
using Onshi.POS.Formularios.Properties;
using Onshi.POS.Formularios.Recursos;
using Onshi.POS.Modelo.Entidades;
using Onshi.POS.Modelo.Entidades.Tipos;
using Onshi.POS.Modelo.Enumeradores;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Configuration;

namespace Onshi.POS.Formularios
{
    public partial class Articulos : FormularioBase, IArticulos
    {
        #region Constructores

        public Articulos(Boolean esBusqueda)
        {
            CheckForIllegalCrossThreadCalls = false;
            InitializeComponent();
            btnSeleccionar.Visible = esBusqueda;
            presentador = new ArticulosPresentador(this);
            procesando = new Procesando();
        }

        #endregion

        #region Atributos

        private Boolean inicializando = true;
        private ArticulosPresentador presentador;
        private Int32 idArticulo;
        private enum MetodoHilo { Inicializar, Actualizar, Eliminar, Habilitar, Nuevo, Modificar };

        #endregion

        #region Propiedades

        public Int32 IdArticuloSeleccionado
        {
            get { return idArticulo; }
        }

        [Browsable(false)]
        public List<Int32> IdSubRubrosArticulosFiltro
        {
            get { return ucSubRubrosArticulosFiltro.IdSubRubrosArticulosSeleccionados; }
        }

        [Browsable(false)]
        public Int32 IdArticulo
        {
            get { return idArticulo; }
        }

        [Browsable(false)]
        public EnumActivoInactivo EstadoFiltro
        {
            get { return gruFiltroSimple.Visible ? (EnumActivoInactivo)((Byte)cboEstadoFiltroSimple.SelectedValue) : (EnumActivoInactivo)((Byte)cboEstadoFiltro.SelectedValue); }
        }

        [Browsable(false)]
        public String CodigoFiltro
        {
            get { return gruFiltroSimple.Visible ? txtCodigoFiltroSimple.Text : txtCodigoFiltro.Text; }
        }

        [Browsable(false)]
        public Int32 IdUsuarioSistema
        {
            get { return Principal.IdUsuarioSistema; }
        }

        [Browsable(false)]
        public String NombreFiltro
        {
            get { return gruFiltroSimple.Visible ? txtNombreFiltroSimple.Text : txtNombreFiltro.Text; }
        }

        [Browsable(false)]
        public List<Articulo> ListadoArticulos
        {
            set { bsArticulos.DataSource = new SortableList<Articulo>(value); }
        }

        [Browsable(false)]
        public Int32 IdMarcaFiltro
        {
            get { return (Int32)ucMarcaFiltro.IdMarcaSeleccionado; }
        }

        [Browsable(false)]
        public Int32 IdDescuentoRecargoFiltro
        {
            get { return (Int32)ucDescuentoRecargoCantidadFiltro.IdDescuentoRecargoCantidadSeleccionado; }
        }

        [Browsable(false)]
        public Int32 IdPromocionFiltro
        {
            get { return (Int32)ucDescuentoRecargoFechaHoraFiltro.IdDescuentoRecargoFechaHoraSeleccionado; }
        }

        [Browsable(false)]
        public String CampoPersonalizadoFiltro
        {
            get { return txtCampoPersonalizadoFiltro.Text; }
        }

        [Browsable(false)]
        public Int32 IdProveedorFiltro
        {
            get { return (Int32)ucProveedorFiltro.IdProveedorSeleccionado; }
        }

        [Browsable(false)]
        public Decimal ExistenciaDesdeFiltro
        {
            get { return ucExistenciaFiltro.Desde; }
        }

        [Browsable(false)]
        public Decimal ExistenciaHastaFiltro
        {
            get { return ucExistenciaFiltro.Hasta; }
        }

        [Browsable(false)]
        public Decimal ExistenciaMinimaDesdeFiltro
        {
            get { return ucExistenciaMinimaFiltro.Desde; }
        }

        [Browsable(false)]
        public Decimal ExistenciaMinimaHastaFiltro
        {
            get { return ucExistenciaMinimaFiltro.Hasta; }
        }

        [Browsable(false)]
        public Decimal ExistenciaMaximaDesdeFiltro
        {
            get { return ucExistenciaMaximaFiltro.Desde; }
        }

        [Browsable(false)]
        public Decimal ExistenciaMaximaHastaFiltro
        {
            get { return ucExistenciaMaximaFiltro.Hasta; }
        }

        [Browsable(false)]
        public Byte IdTipoComisionArticuloFiltro
        {
            get { return (Byte)cboTipoComisionArticuloFiltro.SelectedValue; }
        }

        [Browsable(false)]
        public Decimal ComisionDesdeFiltro
        {
            get { return ucComisionFiltro.Desde; }
        }

        [Browsable(false)]
        public Decimal ComisionHastaFiltro
        {
            get { return ucComisionFiltro.Hasta; }
        }

        [Browsable(false)]
        public Decimal ComisionMaximaDesdeFiltro
        {
            get { return ucComisionMaximaFiltro.Desde; }
        }

        [Browsable(false)]
        public Decimal ComisionMaximaHastaFiltro
        {
            get { return ucComisionMaximaFiltro.Hasta; }
        }

        [Browsable(false)]
        public Decimal PrecioVentaGeneralDesdeFiltro
        {
            get { return ucPrecioVentaGeneralFiltro.Desde; }
        }

        [Browsable(false)]
        public Decimal PrecioVentaGeneralHastaFiltro
        {
            get { return ucPrecioVentaGeneralFiltro.Hasta; }
        }

        [Browsable(false)]
        public Byte IdTipoCostoArticuloFiltro
        {
            get { return (Byte)cboTipoCostoArticuloFiltro.SelectedValue; }
        }

        [Browsable(false)]
        public Decimal CostoDesdeFiltro
        {
            get { return ucCostoFiltro.Desde; }
        }

        [Browsable(false)]
        public Decimal CostoHastaFiltro
        {
            get { return ucCostoFiltro.Hasta; }
        }

        [Browsable(false)]
        public Decimal IvaDesdeFiltro
        {
            get { return ucIvaFiltro.Desde; }
        }

        [Browsable(false)]
        public Decimal IvaHastaFiltro
        {
            get { return ucIvaFiltro.Hasta; }
        }

        [Browsable(false)]
        public Byte IdTipoImpuestoArticuloFiltro
        {
            get { return (Byte)cboTipoImpuestoArticuloFiltro.SelectedValue; }
        }

        [Browsable(false)]
        public Decimal ImpuestoDesdeFiltro
        {
            get { return ucImpuestoFiltro.Desde; }
        }

        [Browsable(false)]
        public Decimal ImpuestoHastaFiltro
        {
            get { return ucImpuestoFiltro.Hasta; }
        }

        [Browsable(false)]
        public EnumSiNo ObservacionesFiltro
        {
            get { return (EnumSiNo)((Byte)cboObservacionesFiltro.SelectedValue); }
        }

        [Browsable(false)]
        public EnumSiNo ImagenFiltro
        {
            get { return (EnumSiNo)((Byte)cboImagenFiltro.SelectedValue); }
        }

        [Browsable(false)]
        public Byte IdTipoArticuloFiltro
        {
            get { return gruFiltroSimple.Visible ? (Byte)cboTipoArticuloFiltroSimple.SelectedValue : (Byte)cboTipoArticuloFiltro.SelectedValue; }
        }

        #endregion

        #region Metodos

        private void LimpiarFiltro()
        {
            inicializando = true;
            txtCodigoFiltroSimple.Text = String.Empty;
            txtNombreFiltroSimple.Text = String.Empty;
            cboEstadoFiltroSimple.SelectedValue = (Byte)EnumActivoInactivo.Todos;
            txtCodigoFiltro.Text = String.Empty;
            txtNombreFiltro.Text = String.Empty;
            cboObservacionesFiltro.SelectedValue = (Byte)EnumSiNo.Todos;
            cboEstadoFiltro.SelectedValue = (Byte)EnumActivoInactivo.Todos;
            cboImagenFiltro.SelectedValue = (Byte)EnumSiNo.Todos;
            inicializando = false;
        }

        private void Filtrar()
        {
            if (!inicializando)
                presentador.Filtrar();
        }

        #endregion

        #region Eventos

        #region Filtro

        private void ucSubRubrosArticulosFiltro_Seleccionado()
        {
            Filtrar();
        }

        private void cboTipoArticuloFiltroSimple_SelectionChangeCommitted(Object sender, EventArgs e)
        {
            Filtrar();
        }

        private void txtCodigoFiltroSimple_TextChanged(Object sender, EventArgs e)
        {
            Filtrar();
        }

        private void txtNombreFiltroSimple_TextChanged(Object sender, EventArgs e)
        {
            Filtrar();
        }

        private void cboEstadoFiltroSimple_SelectionChangeCommitted(Object sender, EventArgs e)
        {
            Filtrar();
        }

        private void txtCodigoFiltro_TextChanged(Object sender, EventArgs e)
        {
            Filtrar();
        }

        private void txtNombreFiltro_TextChanged(Object sender, EventArgs e)
        {
            Filtrar();
        }

        private void cboEstadoFiltro_SelectionChangeCommitted(Object sender, EventArgs e)
        {
            Filtrar();
        }

        private void cboObservacionesFiltro_SelectionChangeCommitted(Object sender, EventArgs e)
        {
            Filtrar();
        }

        private void cboImagenFiltro_SelectionChangeCommitted(Object sender, EventArgs e)
        {
            Filtrar();
        }

        private void ucMarcaFiltro_Seleccionado()
        {
            Filtrar();
        }

        private void ucDescuentoRecargoCantidadFiltro_Seleccionado()
        {
            Filtrar();
        }

        private void ucDescuentoRecargoFechaHoraFiltro_Seleccionado()
        {
            Filtrar();
        }

        private void txtCampoPersonalizadoFiltro_TextChanged(Object sender, EventArgs e)
        {
            Filtrar();
        }

        private void ucProveedorFiltro_Seleccionado()
        {
            Filtrar();
        }

        private void ucExistenciaFiltro_CambioValor()
        {
            Filtrar();
        }

        private void ucExistenciaMinimaFiltro_CambioValor()
        {
            Filtrar();
        }

        private void ucExistenciaMaximaFiltro_CambioValor()
        {
            Filtrar();
        }

        private void cboTipoComisionArticuloFiltro_SelectionChangeCommitted(Object sender, EventArgs e)
        {
            Filtrar();
        }

        private void ucComisionFiltro_CambioValor()
        {
            Filtrar();
        }

        private void ucComisionMaximaFiltro_CambioValor()
        {
            Filtrar();
        }

        private void ucPrecioVentaGeneralFiltro_CambioValor()
        {
            Filtrar();
        }

        private void cboTipoCostoArticuloFiltro_SelectionChangeCommitted(Object sender, EventArgs e)
        {
            Filtrar();
        }

        private void ucCostoFiltro_CambioValor()
        {
            Filtrar();
        }

        private void ucIvaFiltro_CambioValor()
        {
            Filtrar();
        }

        private void cboTipoImpuestoArticuloFiltro_SelectionChangeCommitted(Object sender, EventArgs e)
        {
            Filtrar();
        }

        private void ucImpuestoFiltro_CambioValor()
        {
            Filtrar();
        }

        private void cboTipoArticuloFiltro_SelectionChangeCommitted(Object sender, EventArgs e)
        {
            Filtrar();
        }

        #endregion

        private void Articulos_Load(Object sender, EventArgs e)
        {
            grdArticulos.ScrollBars = ScrollBars.None;
            bgwArticulos.RunWorkerAsync(MetodoHilo.Inicializar);
            procesando.ShowDialog();
        }

        private void btnNuevo_Click(Object sender, EventArgs e)
        {
            var articulosAltaModificacion = new ArticulosAltaModificacion();
            if (articulosAltaModificacion.ShowDialog() == DialogResult.OK)
            {
                var nuevo = false;
                switch (articulosAltaModificacion.TipoArticulo)
                {
                    case EnumTiposArticulos.Estandar:
                        if (new ArticulosAltaModificacionEstandar().ShowDialog() == DialogResult.OK)
                            nuevo = true;
                        break;
                    case EnumTiposArticulos.Servicio:
                        if (new ArticulosAltaModificacionServicio().ShowDialog() == DialogResult.OK)
                            nuevo = true;
                        break;
                    case EnumTiposArticulos.Compuesto:
                        if (new ArticulosAltaModificacionCompuesto().ShowDialog() == DialogResult.OK)
                            nuevo = true;
                        break;
                }
                if (nuevo)
                {
                    bgwArticulos.RunWorkerAsync(MetodoHilo.Nuevo);
                    procesando.ShowDialog();
                }
            }
        }

        private void btnModificar_Click(Object sender, EventArgs e)
        {
            var modificar = false;
            switch ((EnumTiposArticulos)((Articulo)bsArticulos.Current).Tipo.Id)
            {
                case EnumTiposArticulos.Estandar:
                    if (new ArticulosAltaModificacionEstandar(((Articulo)bsArticulos.Current).Id).ShowDialog() == DialogResult.OK)
                        modificar = true;
                    break;
                case EnumTiposArticulos.Servicio:
                    if (new ArticulosAltaModificacionServicio(((Articulo)bsArticulos.Current).Id).ShowDialog() == DialogResult.OK)
                        modificar = true;
                    break;
                case EnumTiposArticulos.Compuesto:
                    break;
            }
            if (modificar)
            {
                bgwArticulos.RunWorkerAsync(MetodoHilo.Modificar);
                procesando.ShowDialog();
            }
        }

        private void btnEliminar_Click(Object sender, EventArgs e)
        {
            if (MessageBox.Show("¿Esta seguro que desea eliminar el articulo?", ConfigurationManager.AppSettings["NombreAplicacion"], MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
            {
                bgwArticulos.RunWorkerAsync(MetodoHilo.Eliminar);
                procesando.ShowDialog();
            }
        }

        private void btnHabilitar_Click(Object sender, EventArgs e)
        {
            if (MessageBox.Show("¿Esta seguro que desea habilitar el articulo?", ConfigurationManager.AppSettings["NombreAplicacion"], MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
            {
                bgwArticulos.RunWorkerAsync(MetodoHilo.Habilitar);
                procesando.ShowDialog();
            }
        }

        private void btnActualizar_Click(Object sender, EventArgs e)
        {
            bgwArticulos.RunWorkerAsync(MetodoHilo.Actualizar);
            procesando.ShowDialog();
        }

        private void btnSeleccionar_Click(Object sender, EventArgs e)
        {
            idArticulo = ((Articulo)bsArticulos.Current).Id;
            DialogResult = DialogResult.OK;
        }

        private void btnSalir_Click(Object sender, EventArgs e)
        {
            Close();
        }

        private void btnLimpiar_Click(Object sender, EventArgs e)
        {
            LimpiarFiltro();
            presentador.Filtrar();
        }

        private void bgwArticulos_DoWork(Object sender, DoWorkEventArgs e)
        {
            try
            {
                switch ((MetodoHilo)e.Argument)
                {
                    case MetodoHilo.Inicializar:

                        presentador.Inicializar();
                        cboTipoImpuestoArticuloFiltro.Actualizar();
                        cboTipoCostoArticuloFiltro.Actualizar();
                        cboTipoComisionArticuloFiltro.Actualizar();
                        cboTipoArticuloFiltro.Actualizar();
                        cboTipoArticuloFiltroSimple.Actualizar();
                        cboObservacionesFiltro.Actualizar();
                        cboEstadoFiltro.Actualizar();
                        cboEstadoFiltroSimple.Actualizar();
                        cboImagenFiltro.Actualizar();
                        ucExistenciaFiltro.Actualizar();
                        ucExistenciaMinimaFiltro.Actualizar();
                        ucExistenciaMaximaFiltro.Actualizar();
                        ucComisionFiltro.Actualizar();
                        ucComisionMaximaFiltro.Actualizar();
                        ucPrecioVentaGeneralFiltro.Actualizar();
                        ucCostoFiltro.Actualizar();
                        ucIvaFiltro.Actualizar();
                        ucImpuestoFiltro.Actualizar();
                        ucSubRubrosArticulosFiltro.LimpiarCampos();
                        break;
                    case MetodoHilo.Actualizar:
                        presentador.Actualizar();
                        break;
                    case MetodoHilo.Eliminar:
                        presentador.Eliminar();
                        break;
                    case MetodoHilo.Habilitar:
                        presentador.Habilitar();
                        break;
                    case MetodoHilo.Nuevo:
                        presentador.Nuevo();
                        break;
                    case MetodoHilo.Modificar:
                        presentador.Modificar();
                        break;
                }
            }
            catch (Exception ex)
            {
                throw new InvalidOperationException(ex.Message);
            }
        }

        private void bgwArticulos_RunWorkerCompleted(Object sender, RunWorkerCompletedEventArgs e)
        {
            inicializando = false;
            procesando.Close();
            if (e.Error != null)
                MessageBox.Show(e.Error.Message, ConfigurationManager.AppSettings["NombreAplicacion"], MessageBoxButtons.OK, MessageBoxIcon.Information);
            else
                actArticulos.Actualizar();
            grdArticulos.ScrollBars = ScrollBars.Both;
        }

        private void grdArticulos_CellFormatting(Object sender, DataGridViewCellFormattingEventArgs e)
        {
            if (bsArticulos.Count > 0 && bsArticulos.Count == grdArticulos.RowCount)
            {
                if (((Articulo)bsArticulos.List[e.RowIndex]).EstaEliminado)
                    grdArticulos.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.LightCoral;
                if (grdArticulos.Columns[e.ColumnIndex].Index == colObservaciones.Index)
                {
                    if (((Articulo)bsArticulos.List[e.RowIndex]).TieneObservaciones)
                        e.Value = Properties.Resources.page_copy;
                }
                else if (grdArticulos.Columns[e.ColumnIndex].Index == colImagen.Index)
                {
                    if (((Articulo)bsArticulos.List[e.RowIndex]).TieneImagen)
                        e.Value = Properties.Resources.picture;
                }
                else if (grdArticulos.Columns[e.ColumnIndex].Index == colProveedores.Index)
                {
                    if (((Articulo)bsArticulos.List[e.RowIndex]).TieneProveedores)
                        e.Value = Properties.Resources.user_green;
                }
            }
        }

        private void grdArticulos_SelectionChanged(Object sender, EventArgs e)
        {
            if (bsArticulos.Current != null)
            {
                btnImprimir.Enabled = true;
                btnImprimirSimple.Enabled = true;
                btnSeleccionar.Enabled = true;
                var articulo = (Articulo)bsArticulos.Current;
                idArticulo = articulo.Id;
                if (articulo.EstaEliminado)
                {
                    btnModificar.Enabled = true;
                    btnEliminar.Enabled = false;
                    btnHabilitar.Enabled = true;
                }
                else if (!articulo.EstaEliminado)
                {
                    btnModificar.Enabled = true;
                    btnEliminar.Enabled = true;
                    btnHabilitar.Enabled = false;
                }
                else
                {
                    btnModificar.Enabled = true;
                    btnEliminar.Enabled = true;
                    btnHabilitar.Enabled = true;
                }
            }
            else
            {
                idArticulo = 0;
                btnSeleccionar.Enabled = false;
                btnModificar.Enabled = false;
                btnEliminar.Enabled = false;
                btnHabilitar.Enabled = false;
                btnImprimir.Enabled = false;
                btnImprimirSimple.Enabled = false;
            }
        }

        private void grdArticulos_CellClick(Object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex != -1)
                if (bsArticulos.Current != null && e.ColumnIndex == colDetalle.Index)
                {
                    switch (((EnumTiposArticulos)((Articulo)bsArticulos.Current).Tipo.Id))
                    {
                        case EnumTiposArticulos.Estandar:
                            var articulosEstandarDetalle = new ArticulosEstandarDetalle(((Articulo)bsArticulos.Current).Id);
                            articulosEstandarDetalle.ShowDialog();
                            break;
                        case EnumTiposArticulos.Servicio:
                            var articulosServicioDetalle = new ArticulosServicioDetalle(((Articulo)bsArticulos.Current).Id);
                            articulosServicioDetalle.ShowDialog();
                            break;
                        case EnumTiposArticulos.Compuesto:
                            var articulosCompuestoDetalle = new ArticulosCompuestoDetalle(((Articulo)bsArticulos.Current).Id);
                            articulosCompuestoDetalle.ShowDialog();
                            break;
                    }
                }
        }

        private void btnLimpiarSimple_Click(Object sender, EventArgs e)
        {
            LimpiarFiltro();
            presentador.Filtrar();
        }

        private void btnActualizarSimple_Click(Object sender, EventArgs e)
        {
            bgwArticulos.RunWorkerAsync(MetodoHilo.Actualizar);
            procesando.ShowDialog();
        }

        private void btnFiltroSimple_Click(Object sender, EventArgs e)
        {
            gruFiltro.Visible = true;
            gruFiltroSimple.Visible = false;
            grdArticulos.Height = grdArticulos.Height - 188;
            grdArticulos.Top = grdArticulos.Top + 188;
            LimpiarFiltro();
            presentador.Filtrar();
            txtCodigoFiltro.Focus();
        }

        private void btnImprimirSimple_Click(Object sender, EventArgs e)
        {

        }

        private void btnFiltro_Click(Object sender, EventArgs e)
        {
            gruFiltro.Visible = false;
            gruFiltroSimple.Visible = true;
            grdArticulos.Height = grdArticulos.Height + 188;
            grdArticulos.Top = grdArticulos.Top - 188;
            LimpiarFiltro();
            presentador.Filtrar();
            txtCodigoFiltroSimple.Focus();
        }

        private void btnImprimir_Click(Object sender, EventArgs e)
        {

        }

        #endregion
    }
}